0x01 骚话
前段时间写了个EL表达式简单解析的程序,打算用来增强WAF,解决一些包含EL表达式的payload对WAF的绕过(利用字符串拼接、java语法trick等),刚看到Thymeleaf在3.0.12添加了Restricted mode用于限制一些静态方法和实例化的调用,好像跟我做的东西有一点点相似。所以,本着工匠精神,还是想研究了一下老外是怎么做的,所以打开了Thymeleaf的源码。
0x02 细节
重点源码在:
1 | (thymeleaf) |
和1
2
3(thymeleaf-spring)
org.thymeleaf.standard.util.StandardExpressionUtils#containsOGNLInstantiationOrStatic
分别在两个类里面,这里简单的说说,thymeleaf工程内自带的是OGNL解析的实现,而thymeleaf-spring的工程,引入了SPEL解析的实现。
看了下两个方法的源码,竟如此雷同
本以为3.0.12是Thymeleaf RCE的终结,然而,仔细一看代码,发现很简单就可以绕过。。。
只要在T和(之间添加若干个空格字符,就能绕过检测了
所以,RCE的payload只是简单的多加几个空格:
1 | ${T (java.lang.Runtime).getRuntime().exec("whoami")} |
0x03 其它
已经给官方提交issue了:https://github.com/thymeleaf/thymeleaf/issues/828